//
//  main.c
//  字符串存储
//
//  Created by ws on 2017/7/21.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>

/**
 字符串存储
 总结:
 字符数组存储的字符是在栈,栈是可读可写的,所以字符的内容可以任意系修改
 使用char类型的指针定义的字符串,它是在常量区,常量区是一个只读区,所它所指向的内容是不可以修改的
 使用场景:
 1.当你定义的字符串中的内容在后面需要修改的时候就使用字符数组
 2.当你定义的字符串不需要修改的时候就使用字符指针来定义字符串
 
 常量的有点:
 1、常量区的东西无论使用多少次,在内存只有一份
 2、效率高,省内存
 3、里面内容不可以修改,可以保证程序的安全性
 */
/**
 定义字符串方式:
 1.使用字符数组定义字符串:字符数组存储的字符是在栈,栈是可读可写的,所以字符的内容可以任意系修改
 2.使用char类型指针定义字符串:使用char类型的指针定义的字符串,它是在常量区,常量区是一个只读区,所它所指向的内容是不可以修改的
 */
void test(){
    //定义字符串方式
    //1.使用字符数组 定义字符串
    char name[] = "zfc";
    name[1] = 'w';
    printf("%s\n",name);
    //2.使用char类型指针定义字符串
    char *name1 = "nc";
    char *name2 = "nc";
    //    *name1 = "ns";//因为这个指针指向的是常量区的内容,所它不能修改其所指向内容,他没有权限,程序会在此处崩溃
}
/**
 字符数组 和 字符指针的区别
 
 */
void testString(){
    char *words  = "today";
    char *sb = "today";
    char *xx = "today";
    
    printf("%p\n",words);
    printf("%p\n",sb);
    printf("%p\n",xx);
}
int main(int argc, const char * argv[]) {
    char name[] = "xhh";//等号右边的"xhh"是在常量区的,但是他会把内容一个一个赋值给字符数组(系统做了char name[] = {'x','h','h','\0'}放到栈里面, 所以可以修改的).
    char *words  = "today";
    char *sb = "today";
    char *xx = "today";

    
    printf("%p\n",words);//0x100000fa0
    printf("%p\n",sb);//0x100000fa0
    printf("%p\n",xx);//0x100000fa0 三个地址是一样的,因为常量区的东西无论使用多少次,在内存只有一份,所以地址一样
//    testString();
    return 0;
}
